sort や sorted は複数回利用することはできない

以下のような sort を行った。

let flavors = try await getFlavors()
  .sorted(by: { $0.title < $1.title })
  .sorted(by: { $0.categoryName < $1.categoryName })
  .sorted(by: { $0.isPrimary && !$1.isPrimary })

このときの意図として

  1. isPrimary フラグが true のものを先に配置。
  2. 次に categoryName でアルファベット順にソート。
  3. 最後に title でアルファベット順にソート。

しかし、このコードでは isPrimary に基づいて最後にソートされるため、最終的なリストは isPrimarytrue の要素が先頭に来るようにソートされるが、categoryNametitle に基づくソート順は保証されない。

正しい振る舞いを実現するためには、ソート条件を一度に組み合わせる必要があり、複数の条件を一つの sorted(by:) 呼び出し内で比較することで達成できる。例えば:

let sortedFlavors = flavors.sorted {
    if $0.isPrimary != $1.isPrimary {
        return $0.isPrimary && !$1.isPrimary
    } else if $0.categoryName != $1.categoryName {
        return $0.categoryName < $1.categoryName
    } else {
        return $0.title < $1.title
    }
}

Swift